Curso de Backend con NodeJs: API REST con express
Configuracion del Entorno
comenzamos con la configuracion del entrono creando la carpeta del projecto. desde la consola y ejecutamos los siguientes comandos:
-
Abrimos visual studio Code
code .
-
instalamos npm por defecto(por esta vez) usando -y
npm init -y
-
gitignore.io
-
comenzamos con la configuracion de este archivo, nos es recomendado entrar a gitignore.io en la barra escogemos los entornos y los sistemas operativos para evitar traquear ciertos archivos del sistema, en este caso escribimos: Node Windows Mac Linux. ->(click en) crear
-
copiamos y pegamos en nuestro archivo la configuracion que nos da la pagina.
-
-
.editorconfig
-
Nos es recomendado para que todos los editores tengan una misma configuracion del editor
-
instalamos un plugin para que nos funcione este archivo, el plugin de visual studio code es: EditorConfig for VS Code
-
Copiamos y pegamos la configuracion que nos dio el profesor:
# Editor configuration, see https://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true [*.js] quote_type = single [*.md] max_line_length = off trim_trailing_whitespace = false
-
-
.eslintrc.json
Copiamos y pegamos la siguiente configuracion para nuestro eslinter y buenas practicas:
{ "parserOptions": { "ecmaVersion": 2018 }, "extends": [ "eslint:recommended", "prettier" ], "env": { "es6": true, "node": true, "jest": true }, "rules": { "no-console": "warn" } }
-
Package.json
-
empezamos con el entorno de desarrollo:
"dev": "nodemon index.js"
-
el entorno de produccion:
escribimos dentro de los comandos de scripts:
"start": "node index.js"
-
correr linter:
escribimos dentro de los comandos de scripts:
"lint": "eslint"
Vamos a levantar un enotrno de desarrollo y produccion. Para esto escribimos dentro de la configuracion de los comandos de scripts:
-
empezamos con el entorno de desarrollo:
npm i nodemon eslint eslint-config-prettier eslint-plugin-prettier prettier -D
finalmente podemos probar que esten listas nuestras dependencias ejecutando los comandos:npm run dev
npm run start
Instalamos la extension de google chrome json viewer para poder leer de una forma más amigable las paginas que vienen en formato json
¿Que son las REST API?
Es una conveccion que se refiere a servicios web por protocolo HTTP
METODOS:
-
Get: obtener.
normalmente se usa para obtener una informacion o solicitar una informacion, por ejemplo los productos que esten en una base de datos. -
Put: Modificar/Actualizar.
Normalmente trabaja sobre modificaciones - Patch: Modifivar/Actualizar
-
Post: Crear
Post es para hacer la creacion - Delete: Eliminar
Patch
Patch El método de solicitud HTTP PATCH aplica modificaciones parciales a un recurso.
PATCH es algo análogo al concepto de “actualización” que se encuentra en CRUD, Una solicitud se considera un conjunto de instrucciones sobre cómo modificar un recurso. Contrasta esto con PUT; que es una representación completa de un recurso.
PATCH Mo es necesariamente idempotente, aunque puede serlo. Contrasta esto con PUT; que siempre es idempotente.
La palabra “idempotente” significa que cualquier número de solicitudes repetidas e idénticas dejará el recurso en el mismo estado.
Por ejemplo, si un campo de contador de incremento automático es una parte integral del recurso, entonces un PUT lo sobrescribirá naturalmente (ya que sobrescribe todo), pero no necesariamente para .PATCH PATCH (como POST) puede tener efectos secundarios sobre otros recursos.
PATCH - HTTP | MDN

Recordando como funciona los metodos, la convencion de REST API nos dice que por cada entidad vamos a tener una ruta o endpoint con el nombre de la entidad y luego nosotros podriamos tener tambien un id que es opcional, pero deberiamos tener un identificador unico para los productos en este caso de uso, no importa si es una base de datos relacional o no relacional.
Get: se puede hacer un Get por ids y obtener tabla de lista de productos
PUT: se lo utiliza el REPLACE individualmente por productos, esto quiere decir que es aconsejable modificar un producto a la vez, si podemos hacer modificaciones en masa pero no es buena practica
PATCH: funciona de la misma manera pero puedo hacer modificaciones más detalladas
POST: no aplica ID, por que nos sirve para crear y no se a creado el id aún
DELETE: se puede hacer en masa pero no es aconsejable, se utiliza para borrar
Getters and setters? GET
Vamos a ver primero de las convenciones

Que son los muy nombrados endpoints?
Para los que como yo, no sabíamos que es endpoints la palabra que tanto utiliza el profe:
Los endpoints son las URLs de un API o un backend que responden a una petición. Los mismos entrypoints tienen que calzar con un endpoint para existir. Algo debe responder para que se renderice un sitio con sentido para el visitante.
/:id -> los dos putos significan o indican que lo que se va a recibir es un parametro
puedo definir uno de esos parametros id así(aunque utilizare la convencion ecmascript6) -> const id = req.params.id; cabe recalcar que debe ir talcual como defino en el slash



GET: Query Params(Parametros Query)
Los Parametros Tipo Query que normalmente son opcionales podemos hacer cosas como por ejemplo:
-
paginar:
en la pagina numero 1 tenemos tales productos y cierta cantidad
-
Paginacion Limit&Offset:
Otra estrategia de Paginacion
-
Filtrar:
por ejemplo quiero todos los productos que se vendan en el territorio de los Estados Unidos
-
Doble Filtro:
Quiero todos los productos que se vendan en tal region pero de esta marca en especifico
pero.. ¿COMO recogemos paramtros tipo Query?
? -> usamos al momento de recoger parametros tipo Query acompañados de su nombre y su definicion
Poblar con Data FAke
Vamos a poblar de informacion más consisa para nuestros productos, vamos a instalar una libreria para generar data fake
Vamos a la consola y vamos a ejecutar el siguiente comando para instalar Faker:
-
npm i faker
-
Luego importamos la libreria escribiendo el codigo en el archivo index.js
const faker = require('faker');
-
Luego en el codigo creamos un array de productos y un for para que se cree de forma automatica y dinamica los productos, con las instrucciones para generar nombre aleatorio etc.
-
Ahora vamos a agregarle un limite, además vamos a capturar los parametros con un Query llamado size, en caso de no enviarle tamaño que el limite sea de 10 productos, agregando el siguiente codigo:.
const { size } = req.query;
const limit = size || 10;
for (let index = 0; index < limit; index++)...
Errores:
Hay veces que creamos rutas o routings o url especificas en conjunto de rutas dinamicas, hay veces que al ingresar a una ruta especifica me devuelve como una ruta dinamica, ese es un error muy común y la unica forma de solucionarlo es escribiendo primero las rutas especificas y despues las rutas dinámicas.
hay que poner primero las direcciones especificas y luego las dinamicas
Single Responsability Principle(Separacion de responsabilidades con expressrouter)
El principio de una sola responsabilidad se trata de que cada artefacto, cada pieza de codigo debe tener una sola responsabilidad.
El principio de una sola responsabilidad se puede aplicar para clases, archivos y metodos..EJM:
Un metodo llamado sumar solo deberia sumar, si se quiere hacer otras cosas como restar solo deberian restar.
Esto se ve facil en los metodos, pero este principio es algo que escala también a los archivos, por ejemplo para el routing deberia dividirse los endpoints por dominio especifico por cada archivo y tener un solo archivo que se encargue de definir todas las rutas de cada uno de un endpint en especifico, separando las responsabilidades. Por Ejemplo:
/products -> tiene todo el funcionamiento de los productos. /categorias -> tiene todo el routing de las categorias.
¿Como se lo ejecuta en NodeJS?
-
Creamos una carpeta especifica para las rutas.
En el home de nuestro proyecto desde la consola podemos ejecutar el comando mkdir Routes y luego creamos el archivo index.js en esa carpeta
-
Vamos a empezar por crear la carpeta de productos:
Podemos llamarlo de las formas o normas productos.js, productosRouter.js o productos.router.js y desde la consola podemos ejecutar el comando touch "nombre". Es importante que te decidas por una sola norma al momento de llamar tus archivos.
-
Como en nuestro proyecto habíamos estado trabajando de forma incorrecta, vamos a empezar a hacerlo de la forma correcta, comenzando por cortar y pegar todas las funciones referentes a productos. Y de igual manera con todos las otras funciones de las otras entidades o rutas, como el de usuarios, categorias, etc.
-
ya pegadas las funciones, llamamos a las dependecias y ademas creamos una nueva constante que acceda el metodo router de express.
-
Ahora eliminamos de las rutas de los productos el endpoint productos, dejando solo las rutas especificas o las dinamicas.
Ademas tambien reemplazamos app por router.
-
Finalmente dejamos al final a porductos como un modulo exportable con el codigo:
module.exports = router;
- Ahora necesitamos configurar las rutas, dentro de la carpeta routes creamos un nuevo archivo index.js para que cumpla esta funcion.
-
importamos productosRouter y establecemos el endpoint y especificamos la ruta, finalizando por exportar el la funcion que creamos para establecer el endpoint, la vamos a llamar routerApi.
Y lo mismo debemos hacer con el resto de archivos, entidades o endpoints, todos iran dentro de la funcion routerApi
-
Ahora configuramos el archivo index.js del home de nuestro proyecto.
- importamos el archivo index.js de la carpeta routes llamada romo routerApi, en este caso no es necesario que especifiquemos el archivo index.js por que ya busca por defecto a este archivo.
-
finalmente llamamos a la funcion routerApi, enviandole como parametro a express
routerApi(app);
-
Listo termiamos de modularizar nuestra aplicacion(Aplicamos la programacion orientada a objetos)
Instalacion de postman
Para poder probar nuestra API de forma más productiva vamos a tener que usar algún cliente de APIs que nos permita hacer las pruebas de funcionamiento de lo que estás construyendo, los dos clientes más famosos son Insomnia y Postman y vas a necesitar de alguno de ellos para ir probando cada característica que vamos a ir construyendo en nuestro servicio de Platzi Store.
Insomnia Como cliente para probar APIs tiene grandes características, destaca principalmente por una interfaz limpia y sencilla, pero a la vez potente, en donde puede configurar ambientes, exportar e importar, gran soporte con GraphQL, etc. Insomnia será el que vamos a usar en este curso 🙂
Instalación La instalación es sencilla, solo tienes que ingresar a https://insomnia.rest/download y descargar el instalador. Una vez esté descargado lo ejecutas y sigues los pasos de la instalación; en caso de Windows descarga un archivo .exe, en caso de Mac descarga un .dmg, y finalmente, en caso de Ubuntu descargas el .deb.
Manejo de versionados:
necesitamos un cliente para hacer un post, vamos a usar Insomnia
- Abrimos insomnia, hacemos click derecho y seleccionamos New Request(empezamos creando un request collection antes).
- le ponemos en este caso el nombre de Get Productos.
-
en la barra insertamos nuestra direccion URL en la que vamos a trabajar, y le damos click en send.
- vamos de nuevo a crear un nuevo request pero vamos a utilizar un nuevo metodo. en este caso Post, lo llamaremos Create product.
-
Vamos al mismo EndPoint, le decimos que queremos enviar en formato JSON. y creamos el cuerpo:
Nos sale un error 404, pero ya lo esperabamos por que no hemos creado el metodo que atienda el metodo post, dentro de los metodos de producto. -
Creamos el metodo post:
y lo volvemos a probar:"El término middleware se refiere a un sistema de software que ofrece servicios y funciones comunes para las aplicaciones. En general, el middleware se encarga de las tareas de gestión de datos, servicios de aplicaciones, mensajería, autenticación y gestión de API. ⠀⠀⠀ Ayuda a los desarrolladores a diseñar aplicaciones con mayor eficiencia. Además, actúa como hilo conductor entre las aplicaciones, los datos y los usuarios.
fuente: https://www.redhat.com/es/topics/middleware/what-is-middleware"
-
Implementamos el middleware nativo que tiene express. con el codigo en el index.js del proyecto.
app.use(express.json());
probamos y...
Perfecto!!! nos llego la informacion
PUT, PATCH Y DELETE
para usar estos metodos necesitamos un idPUT: tenemos para PUT en el rato de usarlo y actualizar la informamcion de nuestros "productos" llenar todos los atributos de este producto.
PATCH: Me permite hacer una modificacion parcial del producto, esto quiere decir que puedo actualizar informacion de los atributos que yp quiera cambiar por ejemplo solo el nombre, o solo el precio.
DELETE: En este caso se lo implemetaria de igual manera, con la diferencia que no necesitariamos el body, solo un identificador que identifique al producto y lo elimine.

Status Code
siguiendo la convencion que nos propone REST, es manegar un buen Status Code. Status Code es un estandar que nos permite saber que paso con la solicitud, siendo el más común el 404 NOT FOUND, cuando encontramos un recurso que el servidor no pudo encontrar o el más aterrador o desastrozo que es un error 500 donde el servidor por algún lado se rompio.Pagina de mozilla sobre http
Pagina sobre http response Status Code
Ejemplificaciones divertidas con gatos
¿Como implementar el status code?
en el caso de Post lo implementamos y probamos así:

En el caso de GET:

en el caso que get sea un 404
